const isDebug = false;
const saveLog = false;
const localIP = `[local]`;
// 服务器本机对外服务IP
const moment = require('moment');
moment.locale('zh-cn');
// 自动分配IP的所属网段（请不要轻易改动！！！）
module.exports = {
    moment,
    title: "Node-ONVIF",
    // 是否显示全日志在控制台
    log4js: {
        // 系统日志文件保存配置，请不要轻易改动
        appenders: {
            syslog: {
                type: "dateFile",
                filename: "./logs/syslog", //您要写入日志文件的路径
                alwaysIncludePattern: true, //（默认为false） - 将模式包含在当前日志文件的名称以及备份中
                //compress: true,//（默认为false） - 在滚动期间压缩备份文件（备份文件将具有.gz扩展名）
                pattern: "yyyy-MM-dd.log", //（可选，默认为.yyyy-MM-dd） - 用于确定何时滚动日志的模式。格式:.yyyy-MM-dd-hh:mm:ss.log
                encoding: "utf-8", //default "utf-8"，文件的编码
                maxLogSize: 1024 * 1024 * 10, //文件最大存储空间，当文件内容超过文件存储空间会自动生成一个文件xxx.log.1的序列自增长的文件
            },
            logConsole: {
                type: "console",
            },
        },
        categories: {
            default: {
                appenders: ["syslog"],
                level: "all",
            },
            xcLogFile: {
                appenders: ["syslog"],
                level: "all",
            },
            xcLogConsole: {
                appenders: ["logConsole"],
                level: "all",
            },
        },
        disableClustering: true,
        //禁用日志的集群模式
    },

    // 日志处理类
    log(func, msg, type) {
        const saveLog4js = (type, ...args) => {
            let func = args[0]
            if (args[0].indexOf(`PID:`) > -1) {
                func = args[1]
            }
            let msg = []
            for (let i = 0; i < args.length; i++) {
                if (args[0].indexOf(`PID:`) > -1) {
                    if (i !== 1) msg.push(args[i])
                } else {
                    if (i !== 0) msg.push(args[i])
                }
            }
            if (saveLog === true) {
                const LogFile = log4js.getLogger(func)
                if ((type == undefined || type == 'debug' || type == 'log')) {
                    LogFile.debug(msg.join(' ').trim())
                } else if (type == 'err' || type == 'error') {
                    LogFile.error(msg.join(' ').trim())
                } else if (type == 'warn') {
                    LogFile.warn(msg.join(' ').trim())
                } else if (type == 'info') {
                    LogFile.info(msg.join(' ').trim())
                } else {
                    LogFile.trace(msg.join(' ').trim())
                }
            }
        }
        const logTime = () => {
            return moment(new Date()).format("YY-MM-DD HH:mm:ss")
        }
        const log = (...args) => {
            let msg = [
                ...args,
            ]
            saveLog4js(`log`, ...msg)
            console.log(logTime(), '[INFO]', ...msg)
        }
        const info = (...args) => {
            let msg = [
                ...args,
            ]
            saveLog4js(`info`, ...msg)
            console.info(logTime(), '[INFO]', ...msg)
        }
        const error = (...args) => {
            let msg = [
                ...args,
            ]
            saveLog4js(`error`, ...msg)
            console.log(logTime(), '[ERROR]', ...msg)
        }
        const debug = (...args) => {
            let msg = [
                ...args,
            ]
            saveLog4js(`debug`, ...msg)
            if (isDebug) console.log(logTime(), '[DEBUG]', ...msg)
        }
        const warn = (...args) => {
            let msg = [
                ...args,
            ]
            saveLog4js(`warn`, ...msg)
            console.warn(logTime(), '[WARN]', ...msg)
        }
        if (typeof (msg) !== `string`) msg = JSON.stringify(msg)
        if ((type == undefined || type == 'debug' || type == 'log')) {
            debug(func, msg)
        } else if (type == 'err' || type == 'error') {
            error(func, msg)
        } else if (type == 'warn') {
            warn(func, msg)
        } else if (type == 'info') {
            info(func, msg)
        } else {
            log(func, msg)
        }
        return msg;
    },
    getRandomInt(min, max) {
        min = Math.ceil(min);
        max = Math.floor(max);
        return Math.floor(Math.random() * (max - min + 1)) + min;
    },
    isDebug,
    saveLog,
    // 调试模式（控制台打印所有日志信息）
    http: {
        port: 8881,
        // 网站服务端口
        localIP,
        // 服务器本机对外服务IP
        webroot: `/wwwroot`,
        // 网站根目录
        allowOrigin: '*',
        // 设置跨域授权
        defaultFile: [`index.html`, `index.htm`, `index.php`],
        // 站点默认首页，按先后顺序设置
        limit: `50mb`,
        // 站点默认首页，按先后顺序设置
        timeout: 10000,
        // 脚本执行超时时间单位毫秒
        useGzip: true,
        // 使用Gzip压缩http文本传输部分
        globalCatchError: false,
        // 全局容错
        sessionExpired: 1000
    },
    rtspWsStream: {
        rtmp: {
            port: 15001,
            chunk_size: 1024,
            gop_cache: true,
            ping: 60,
            ping_timeout: 30
        },
        http: {
            port: 15000,
            allow_origin: '*',
        },
        baseUri: `ws://${localIP}`,
        // 服务器本机对外服务地址
        waitTime: 600,
        // 视频推流服务0连接等待时间，单位秒，超时无连接则自动停止拉流转码服务
        videoSizeRate: 0.6,
        // 视频缩放比例
        probesize: "8K",
        // 设置输入缓存大小
        loglevel: '0',
        nostats: '-nostats',
        ffmpegOptions: [
            '-hide_banner',
            '-err_detect',
            // 忽略错误检测
            'ignore_err',
            // 忽略错误检测
            '-ignore_unknown',
            // 忽略未知流类型
            '-hwaccel_device', '0',
            '-loglevel', 'quiet',
            '-c:v', 'libx264', // 视频编码器 libx264, mpeg1video
            '-an',
            '-f', 'flv', // 输出格式为FLV
            '-flvflags', 'no_duration_filesize', // FLV相关标志
            '-preset', 'ultrafast',  // 编码速度非常快，但输出视频质量不高
            // '-preset', 'superfast',     // 编码速度非常快，但输出视频质量比ultrafast略微高一些
            // '-preset', 'veryfast',   // 编码速度比较快，输出视频质量较好
            // '-preset', 'faster',     // 编码速度比较快，输出视频质量比veryfast略微差一些
            // '-preset', 'fast',       // 编码速度适中，输出视频质量较好
            // '-preset', 'medium',     // 编码速度适中，输出视频质量非常好，是默认值
            // '-preset', 'slow',       // 编码速度较慢，但输出视频质量比medium更好
            // '-preset', 'slower',     // 编码速度比slow略微慢一些，但输出视频质量更好
            // '-preset', 'veryslow',   // 编码速度最慢，但输出视频质量最好
            '-vf', 'scale=640:-2',      // 视频缩放，宽度不超过:640px
            '-crf', '28',               // 设置输出视频的质量（可选，范围18-28，值越低质量越高）
            // '-r', '6',                  // 每秒帧数
            '-y'
        ]

    },
    snapshot: {
        w: 1920,
        h: 1080,
        savePath: '../frontend/public/output',
        uri: '/output/',
        videoDuration: 15,
    },
    mysql: {
        host: `zl.ai8.host`,
        port: 38306,
        user: `root`,
        password: `zl@123456`,
        database: `db_road_test`,
        // mode: `mysql2`,
        // ssh: {
        //     host: 'zl.ai8.host',
        //     port: '38022',
        //     username: 'root',
        //     password: 'zl@123456'
        // }
    },
    redis: {
        ser: `localhost`,
        port: 6379,
        // pwd: 'zl@123456',//'kcKJ@)@@',
        // ssh: {
        //     host: 'zl.ai8.host',
        //     port: '38022',
        //     username: 'root',
        //     password: 'zl@123456'
        // }
    },
    execDelay: 3,
    // 每间隔N秒刷新与获取当前摄像头信息与Redis配置信息
    ptzStopDelay: 10,
    // 操作后N秒后回到当前预制位
    savePath: '/save'
    // 截屏录像保存目录
};
